import yaml
import os
from config.constant import PATH_YAML_PATH  # 从constant获取path.yaml路径
from utils.generate_logs_util import get_logger

# 初始化日志
logger = get_logger(__name__)


def read_yaml(yaml_path):
    """
    读取YAML测试数据文件
    :param yaml_path: YAML文件路径（从constant导入）
    :return: YAML文件中的列表数据
    """
    # 检查YAML文件是否存在
    if not os.path.exists(yaml_path):
        logger.error(f"YAML文件不存在！路径：{yaml_path}")
        raise FileNotFoundError(f"YAML文件不存在：{yaml_path}")

    # 读取YAML内容
    try:
        with open(yaml_path, 'r', encoding='utf-8') as f:
            yaml_data = yaml.safe_load(f)  # 安全加载，避免恶意YAML
        logger.info(f"成功读取YAML文件：{yaml_path}，数据条数：{len(yaml_data) if yaml_data else 0}")
        return yaml_data if yaml_data else []
    except Exception as e:
        logger.error(f"读取YAML文件失败！路径：{yaml_path}，错误：{str(e)}", exc_info=True)
        raise  # 抛出异常，让测试用例感知到错误


def get_endpoint(endpoint_key):
    """
    从 path.yaml 中获取接口路径和请求方法
    :param endpoint_key: 接口标识（如 'auth.login'、'pms.user_add'）
    :return: 字典 {'path': '/xxx/xxx', 'method': 'post'}
    """
    # 检查 path.yaml 是否存在
    if not os.path.exists(PATH_YAML_PATH):
        logger.error(f"path.yaml 文件不存在！路径：{PATH_YAML_PATH}")
        raise FileNotFoundError(f"path.yaml不存在：{PATH_YAML_PATH}")

    # 读取 path.yaml 并解析接口路径
    try:
        # 读取 path.yaml 内容
        with open(PATH_YAML_PATH, 'r', encoding='utf-8') as f:
            path_data = yaml.safe_load(f)

        # 解析 endpoint_key（如 'auth.login' → 第一层 'auth'，第二层 'login'）
        keys = endpoint_key.split('.')
        if len(keys) != 2:
            logger.error(f"接口标识格式错误！应为 '模块.接口'（如 auth.login），当前：{endpoint_key}")
            raise ValueError(f"接口标识格式错误：{endpoint_key}")

        module_key, api_key = keys
        # 检查模块是否存在
        if module_key not in path_data:
            logger.error(f"path.yaml 中无此模块！模块：{module_key}，可用模块：{list(path_data.keys())}")
            raise KeyError(f"模块不存在：{module_key}")


        # 检查接口是否存在
        if api_key not in path_data[module_key]:
            logger.error(f"模块 {module_key} 中无此接口！接口：{api_key}，可用接口：{list(path_data[module_key].keys())}")
            raise KeyError(f"接口不存在：{api_key}（模块：{module_key}）")

        # 获取接口路径和方法（默认post，防止配置缺失）
        endpoint_info = path_data[module_key][api_key]
        endpoint_info.setdefault('method', 'post')  # 默认请求方法为post
        logger.info(f"成功获取接口信息：{endpoint_key} → 路径：{endpoint_info['path']}，方法：{endpoint_info['method']}")
        return endpoint_info

    except Exception as e:
        logger.error(f"获取接口路径失败！接口标识：{endpoint_key}，错误：{str(e)}", exc_info=True)
        raise